<?php
/**
 * KidsMind 管理后台通用函数库
 */

/**
 * 显示友好格式的数组或对象
 * @param mixed $data 要显示的数据
 * @param bool $exit 是否在显示后终止脚本
 */
function debug($data, $exit = true) {
    echo '<pre>';
    print_r($data);
    echo '</pre>';
    if ($exit) exit;
}

/**
 * 根据时间戳获取友好的时间格式
 * @param int|string $time 时间戳或日期字符串
 * @return string 友好的时间格式
 */
function friendly_time($time) {
    if (!is_numeric($time)) {
        $time = strtotime($time);
    }
    
    $current = time();
    $diff = $current - $time;
    
    if ($diff < 60) {
        return '刚刚';
    } elseif ($diff < 3600) {
        return floor($diff / 60) . '分钟前';
    } elseif ($diff < 86400) {
        return floor($diff / 3600) . '小时前';
    } elseif ($diff < 2592000) {
        return floor($diff / 86400) . '天前';
    } else {
        return date('Y-m-d', $time);
    }
}

/**
 * 生成URL友好的字符串
 * @param string $string 要处理的字符串
 * @return string URL友好的字符串
 */
function slugify($string) {
    // 转为小写并移除空格
    $string = strtolower(trim($string));
    
    // 替换非字母数字字符为连字符
    $string = preg_replace('/[^a-z0-9-]/', '-', $string);
    
    // 替换多个连字符为单个连字符
    $string = preg_replace('/-+/', '-', $string);
    
    // 移除开头和结尾的连字符
    $string = trim($string, '-');
    
    return $string;
}

/**
 * 检查当前用户是否有指定权限
 * @param string $permission 权限名称
 * @return bool 是否有权限
 */
function has_permission($permission) {
    // 简单实现，只检查是否是管理员
    return isset($_SESSION['admin_logged_in']) && $_SESSION['admin_logged_in'] === true && 
           (isset($_SESSION['admin_role']) && $_SESSION['admin_role'] === 'admin');
}

/**
 * 获取指定尺寸的缩略图URL
 * @param string $image_path 原始图片路径
 * @param int $width 宽度
 * @param int $height 高度
 * @return string 缩略图URL
 */
function get_thumbnail($image_path, $width = 100, $height = 100) {
    if (empty($image_path)) {
        return '../images/placeholder.jpg';
    }
    
    // 这里可以扩展为真正的缩略图生成逻辑
    return $image_path;
}

/**
 * 设置闪存消息
 * @param string $message 消息内容
 * @param string $type 消息类型 (success, info, warning, danger)
 */
function set_flash_message($message, $type = 'info') {
    $_SESSION['flash_message'] = $message;
    $_SESSION['flash_type'] = $type;
}

/**
 * 获取闪存消息并清除
 * @return array|null 消息数组或null
 */
function get_flash_message() {
    if (isset($_SESSION['flash_message'])) {
        $message = [
            'message' => $_SESSION['flash_message'],
            'type' => $_SESSION['flash_type'] ?? 'info'
        ];
        
        // 清除消息
        unset($_SESSION['flash_message'], $_SESSION['flash_type']);
        
        return $message;
    }
    
    return null;
}

/**
 * 转义并过滤HTML输入
 * @param string $input 要处理的输入
 * @return string 处理后的字符串
 */
function safe_html($input) {
    return htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
}

/**
 * 生成随机字符串
 * @param int $length 字符串长度
 * @return string 随机字符串
 */
function random_string($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $rand_string = '';
    for ($i = 0; $i < $length; $i++) {
        $rand_string .= $characters[rand(0, strlen($characters) - 1)];
    }
    return $rand_string;
}

/**
 * 分页函数
 * @param int $total 总记录数
 * @param int $page 当前页码
 * @param int $limit 每页记录数
 * @param string $url 基础URL
 * @return string 分页HTML
 */
function pagination($total, $page, $limit, $url) {
    $totalPages = ceil($total / $limit);
    
    if ($totalPages <= 1) {
        return '';
    }
    
    $output = '<nav aria-label="页面导航"><ul class="pagination justify-content-center">';
    
    // 上一页按钮
    if ($page > 1) {
        $output .= '<li class="page-item"><a class="page-link" href="' . $url . '&page=' . ($page - 1) . '">上一页</a></li>';
    } else {
        $output .= '<li class="page-item disabled"><span class="page-link">上一页</span></li>';
    }
    
    // 页码按钮
    $startPage = max(1, $page - 2);
    $endPage = min($totalPages, $page + 2);
    
    if ($startPage > 1) {
        $output .= '<li class="page-item"><a class="page-link" href="' . $url . '&page=1">1</a></li>';
        if ($startPage > 2) {
            $output .= '<li class="page-item disabled"><span class="page-link">...</span></li>';
        }
    }
    
    for ($i = $startPage; $i <= $endPage; $i++) {
        if ($i == $page) {
            $output .= '<li class="page-item active"><span class="page-link">' . $i . '</span></li>';
        } else {
            $output .= '<li class="page-item"><a class="page-link" href="' . $url . '&page=' . $i . '">' . $i . '</a></li>';
        }
    }
    
    if ($endPage < $totalPages) {
        if ($endPage < $totalPages - 1) {
            $output .= '<li class="page-item disabled"><span class="page-link">...</span></li>';
        }
        $output .= '<li class="page-item"><a class="page-link" href="' . $url . '&page=' . $totalPages . '">' . $totalPages . '</a></li>';
    }
    
    // 下一页按钮
    if ($page < $totalPages) {
        $output .= '<li class="page-item"><a class="page-link" href="' . $url . '&page=' . ($page + 1) . '">下一页</a></li>';
    } else {
        $output .= '<li class="page-item disabled"><span class="page-link">下一页</span></li>';
    }
    
    $output .= '</ul></nav>';
    
    return $output;
}

/**
 * 格式化日期时间
 * @param string $datetime 日期时间
 * @param bool $showTime 是否显示时间
 * @return string 格式化后的日期时间
 */
function formatDateTime($datetime, $showTime = true) {
    if (empty($datetime) || $datetime == '0000-00-00 00:00:00') {
        return '未设置';
    }
    
    $timestamp = strtotime($datetime);
    if ($showTime) {
        return date('Y-m-d H:i:s', $timestamp);
    } else {
        return date('Y-m-d', $timestamp);
    }
}

/**
 * 截断文本
 * @param string $text 原文本
 * @param int $length 截断长度
 * @param string $suffix 后缀
 * @return string 截断后的文本
 */
function truncateText($text, $length = 50, $suffix = '...') {
    if (mb_strlen($text, 'UTF-8') <= $length) {
        return $text;
    }
    
    return mb_substr($text, 0, $length, 'UTF-8') . $suffix;
}

/**
 * 获取表格排序链接
 * @param string $column 列名
 * @param string $title 显示标题
 * @param string $sort 当前排序列
 * @param string $order 当前排序方向
 * @param string $url 基础URL
 * @return string 排序链接HTML
 */
function getSortLink($column, $title, $sort, $order, $url) {
    $newOrder = ($sort == $column && $order == 'asc') ? 'desc' : 'asc';
    $icon = '';
    
    if ($sort == $column) {
        $icon = ($order == 'asc') ? '<i class="bi bi-caret-up-fill ms-1"></i>' : '<i class="bi bi-caret-down-fill ms-1"></i>';
    }
    
    return '<a href="' . $url . '&sort=' . $column . '&order=' . $newOrder . '">' . $title . $icon . '</a>';
}

/**
 * 处理图片上传
 * @param array $file $_FILES数组元素
 * @param string $targetDir 目标目录
 * @param array $allowedTypes 允许的文件类型
 * @param int $maxSize 最大文件大小（字节）
 * @return array 上传结果
 */
function handleImageUpload($file, $targetDir, $allowedTypes = ['image/jpeg', 'image/png', 'image/gif'], $maxSize = 2097152) {
    // 检查文件是否存在
    if (!isset($file) || $file['error'] == UPLOAD_ERR_NO_FILE) {
        return ['success' => false, 'message' => '没有选择文件'];
    }
    
    // 检查上传错误
    if ($file['error'] !== UPLOAD_ERR_OK) {
        $errors = [
            UPLOAD_ERR_INI_SIZE => '文件超过php.ini中upload_max_filesize设置的大小',
            UPLOAD_ERR_FORM_SIZE => '文件超过表单中MAX_FILE_SIZE设置的大小',
            UPLOAD_ERR_PARTIAL => '文件仅部分被上传',
            UPLOAD_ERR_NO_TMP_DIR => '没有临时目录',
            UPLOAD_ERR_CANT_WRITE => '写入文件失败',
            UPLOAD_ERR_EXTENSION => '扩展阻止了文件上传'
        ];
        
        $errorMessage = isset($errors[$file['error']]) ? $errors[$file['error']] : '未知上传错误';
        return ['success' => false, 'message' => $errorMessage];
    }
    
    // 检查文件大小
    if ($file['size'] > $maxSize) {
        return ['success' => false, 'message' => '文件大小超过限制（最大' . formatFileSize($maxSize) . '）'];
    }
    
    // 检查文件类型
    $fileType = mime_content_type($file['tmp_name']);
    if (!in_array($fileType, $allowedTypes)) {
        return ['success' => false, 'message' => '不支持的文件类型'];
    }
    
    // 确保目标目录存在
    if (!is_dir($targetDir)) {
        mkdir($targetDir, 0755, true);
    }
    
    // 生成唯一文件名
    $fileName = generateRandomString() . '_' . time() . '.' . pathinfo($file['name'], PATHINFO_EXTENSION);
    $targetPath = $targetDir . '/' . $fileName;
    
    // 上传文件
    if (move_uploaded_file($file['tmp_name'], $targetPath)) {
        return ['success' => true, 'file_path' => $targetPath, 'file_name' => $fileName];
    } else {
        return ['success' => false, 'message' => '上传文件失败'];
    }
}

/**
 * 格式化文件大小
 * @param int $bytes 文件大小（字节）
 * @return string 格式化后的文件大小
 */
function formatFileSize($bytes) {
    $units = ['B', 'KB', 'MB', 'GB', 'TB'];
    $i = 0;
    
    while ($bytes >= 1024 && $i < count($units) - 1) {
        $bytes /= 1024;
        $i++;
    }
    
    return round($bytes, 2) . ' ' . $units[$i];
} 